/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jogodecartas.controle;

import java.util.Stack;
import jogodecartas.core.Carta;
import jogodecartas.rules.RegrasDeFileiras;
import jogodecartas.rules.RegrasDeFundacoes;

/**
 *
 * @author Diego
 */
public class Transicoes {

    int origem;
    int destino;
    Stack pilhaOrigem = new Stack();
    RegrasDeFundacoes regrasDeFundacoes;
    static RegrasDeFileiras regrasDeFileiras;

    public Transicoes(String origem, String destino) {
        this.destino = Integer.parseInt(destino);
        this.origem = Integer.parseInt(origem);
        regrasDeFundacoes = new RegrasDeFundacoes();
        regrasDeFileiras = new RegrasDeFileiras();
        mudanca();
    }

    public void mudanca() {
        if (origem == 2) {
            switch (destino) {
                case 1:
                    break;
                case 2:
                    break;
                case 3:
                case 4:
                case 5:
                case 6:
                    if (regrasDeFundacoes.verificarRegrasToFundacao(JogoDePaciencia.descarte.getPilhaDeDescarte(), JogoDePaciencia.fundacoes.getFundacao(destino - 3))) {
                        JogoDePaciencia.descarte.primeiraCarta(JogoDePaciencia.descarte.getPilhaDeDescarte()).setEstado(true);
                        JogoDePaciencia.fundacoes.getFundacao(destino - 3).push(JogoDePaciencia.descarte.pegarCarta(JogoDePaciencia.descarte.getPilhaDeDescarte()));
                    }

                    break;
                case 7:
                case 8:
                case 9:
                case 10:
                case 11:
                case 12:
                case 13:
                    if (regrasDeFileiras.verificarRegrasToFileira(JogoDePaciencia.descarte.getPilhaDeDescarte(), JogoDePaciencia.fileiras.getFileira(destino - 7))) {
                        JogoDePaciencia.descarte.primeiraCarta(JogoDePaciencia.descarte.getPilhaDeDescarte()).setEstado(true);
                        JogoDePaciencia.fileiras.getFileira(destino - 7).push(JogoDePaciencia.descarte.pegarCarta(JogoDePaciencia.descarte.getPilhaDeDescarte()));
                    }
                    break;
            }
        } else if (origem >= 3 && origem <= 6) {
            if (destino >= 7 && destino <= 13) {
                if (regrasDeFileiras.verificarRegrasToFileira(JogoDePaciencia.fundacoes.getFundacao(origem - 3), JogoDePaciencia.fileiras.getFileira(destino - 7))) {
                    JogoDePaciencia.fileiras.getFileira(destino - 7).push(JogoDePaciencia.fundacoes.pegarCarta(JogoDePaciencia.fundacoes.getFundacao(origem - 3)));
                }

            }
        } else if (origem >= 7 && origem <= 13) {
            if (destino >= 3 && destino <= 6) {
                if (regrasDeFundacoes.verificarRegrasToFundacao(JogoDePaciencia.fileiras.getFileira(origem - 7), JogoDePaciencia.fundacoes.getFundacao(destino - 3))) {
                    JogoDePaciencia.fundacoes.getFundacao(destino - 3).push(JogoDePaciencia.fileiras.pegarCarta(JogoDePaciencia.fileiras.getFileira(origem - 7)));
                }
            }

            if (destino >= 7 && destino <= 13) {
                capturarPeloIndice(JogoDePaciencia.fileiras.getFileira(origem - 7), JogoDePaciencia.fileiras.getFileira(destino - 7));
            }
        }
    }

    @SuppressWarnings("static-access")
    public static void capturarPeloIndice(Stack origem, Stack destino) {
        Carta cartaOrigem = null;
        Carta cartaDestino = null;
        Stack aux = new Stack();
        if (destino.empty()) {
            for (int i = origem.size() - 1; i >= 0; i--) {
                cartaOrigem = (Carta) origem.get(i);
                if (cartaOrigem.isEstado() && cartaOrigem.getValor() == 13) {
                    int count = i;
                    for (int j = origem.size() - 1; j >= count; j--) {
                        aux.push(origem.pop());
                    }
                }
            }
            System.out.println(destino);
        } else {
            for (int i = origem.size() - 1; i >= 0; i--) {
                cartaOrigem = (Carta) origem.get(i);
                cartaDestino = (Carta) destino.peek();
                if (cartaOrigem.isEstado() && cartaOrigem.getValor() == cartaDestino.getValor() - 1 && regrasDeFileiras.isNaipePermutando(cartaDestino, cartaOrigem)) {
                    int count = i;
                    for (int j = origem.size() - 1; j >= count; j--) {
                        aux.push(origem.pop());
                    }
                }
            }
        }
        while(!aux.empty()){
            destino.push(aux.pop());
        }
    }
}
